package com.gewu.pm.widget;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;

import androidx.core.widget.NestedScrollView;

/**
 * 带有回弹效果的ScrollView
 */
public class CoolScrollView extends NestedScrollView {
    
    /** 动画时长（毫秒） */
    private static final int ANIMATION_DURATION = 200;
    
    /** 要操作的布局 */
    private View innerView;
    /** y坐标点 */
    private float y;
    /** 矩形有四个点，用于记录位置 */
    private final Rect rect = new Rect();
    /** 默认可以拖动页面 */
    private boolean animationFinish = true;

    public CoolScrollView(Context context) {

        super(context);
    }

    public CoolScrollView(Context context, AttributeSet attrs) {

        super(context, attrs);
    }

    public CoolScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onFinishInflate() {
        // 布局文件加载完毕后自动回调此函数
        super.onFinishInflate();
        int childCount = getChildCount();
        // ScrollView只能包含一个子节点
        if (childCount > 0) {
            innerView = getChildAt(0);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (innerView == null) {
            // 如果为空，什么都不做
            return super.onTouchEvent(ev);
        }
        commonTouchEvent(ev);
        return super.onTouchEvent(ev);
    }

    /**
     * 自定义touch处理事件
     *
     * @param ev 触摸事件
     */
    private void commonTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                // 按下时，记录一下当前的Y坐标
                y = ev.getY();
                Log.i("cl", "=======y  ACTION_DOWN ======" + y);
                break;

            case MotionEvent.ACTION_MOVE:
                Log.i("cl", "=======y  ACTION_MOVE ======" + y);
                float preY = y == 0 ? ev.getY() : y;
                float nowY = ev.getY();
                int detailY = (int) (preY - nowY);
                y = nowY;
                
                // 操作view进行拖动detailY的一半（产生阻尼效果）
                if (isNeedMove() && animationFinish) {
                    // 布局改变位置之前，记录一下正常状态下的位置
                    if (rect.isEmpty()) {
                        rect.set(innerView.getLeft(), innerView.getTop(), 
                                innerView.getRight(), innerView.getBottom());
                    }
                    // 拖动内容视图（减半产生阻尼效果）
                    innerView.layout(
                        innerView.getLeft(),
                        innerView.getTop() - detailY / 2,
                        innerView.getRight(),
                        innerView.getBottom() - detailY / 2
                    );
                }
                break;

            case MotionEvent.ACTION_UP:
                y = 0;
                // 布局回滚到原来的位置
                if (!rect.isEmpty()) {
                    // 如果不是空，说明移动过，执行回弹动画
                    animation();
                }
                break;
        }
    }

    /**
     * 回滚动画
     */
    private void animation() {
        if (innerView == null) {
            return;
        }
        
        TranslateAnimation animation = new TranslateAnimation(
            0, 0, 
            0, rect.top - innerView.getTop()
        );
        animation.setDuration(ANIMATION_DURATION);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                // 动画开始的时候，不能再拖动页面了
                animationFinish = false;
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                if (innerView == null) {
                    return;
                }
                innerView.clearAnimation();  // 清除动画
                // 回滚动画结束后，可以开始拖动，位置初始化
                animationFinish = true;
                innerView.layout(rect.left, rect.top, rect.right, rect.bottom);
                rect.setEmpty();  // 设为空值
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                // 不需要重复
            }
        });
        innerView.startAnimation(animation);
    }

    /**
     * 判断是否需要移动（是否到达边界）
     * 
     * @return true-已到达顶部或底部边界，可以拖动回弹；false-不需要
     */
    public boolean isNeedMove() {
        if (innerView == null) {
            return false;
        }
        
        int offset = innerView.getMeasuredHeight() - getHeight();
        int scrollY = getScrollY();
        
        // 到达顶部（scrollY == 0）或底部（scrollY >= offset）
        return scrollY == 0 || scrollY >= offset;
    }

}
